package com.lagou.client;

import com.lagou.model.*;

import java.io.IOException;
import com.lagou.server.ServerDao;
/**
 * 主界面功能实现
 */
public class ClientView {
    /**
     * 使用合成复用原则，得到输入输出流
     */
    private ClientInitClose cic;
    private boolean flag;
    private ServerDao sd = new ServerDao();

    /**
     * 通过构造方法实现成员变量的初始化
     */
    public ClientView(ClientInitClose cic) {
        this.cic = cic;
    }

    /**
     * 自定义成员方法，实现客户端强退时，服务器同时执行关闭操作
     * @throws IOException
     * @throws ClassNotFoundException
     */
    public void systemExit() throws IOException, ClassNotFoundException {
        cic.getOos().writeObject(0);
        flag = (boolean) cic.getOis().readObject();
        if (flag) {
            System.exit(0);
        }
    }
    /**
     * 自定义成员方法实现客户端界面的绘制
     */
    public void clientMainPage() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println();
            System.out.println("******拉勾在线考试系统******");
            System.out.println("      [1] 学员系统");
            System.out.println("      [2] 管理员系统");
            System.out.println("      [0] 退出系统");
            System.out.println("***************************");
            System.out.println();
            System.out.println("请输入要执行的业务编号: ");
            // Scanner sc = new Scanner(System.in);
            // int choice = sc.nextInt();
            int choice = ScannerUtil.scannerOpen().nextInt();
            switch (choice) {
                case 1:
                    System.out.println("正在进入学员系统...");
                    cic.getOos().writeObject(1);
                    flag = (boolean) cic.getOis().readObject();
                    if (flag) {
                        clientStuLogin();
                    }
                    break;
                case 2:
                    System.out.println("正在进入管理员系统...");
                    cic.getOos().writeObject(2);
                    flag = (boolean) cic.getOis().readObject();
                    if (flag) {
                        clientManagerLogin();
                    }
                    break;
                case 0:
                    System.out.println("成功退出系统，欢迎下次使用");
                    cic.getOos().writeObject(0);
                    flag = (boolean) cic.getOis().readObject();
                    if (flag) {
                        return;
                    }
                default:
                    System.out.println("输入不合理，请重新输入: ");
            }
        }
    }

    /**
     * 自定义成员方法，实现学生的登录
     */
    private void clientStuLogin() throws IOException, ClassNotFoundException {
        System.out.println("请输入学员学号: ");
        int id = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入学员姓名: ");
        String stuName = ScannerUtil.scannerOpen().next();
        System.out.println("请输入学员密码: ");
        String stuPassword = ScannerUtil.scannerOpen().next();
        Student stu = new Student(id, stuName, stuPassword);
        StudentMessage stm = new StudentMessage("stuCheck", stu);
        // 通过对象输出流将UserMessage对象传给服务器
        cic.getOos().writeObject(stm);
        stm = (StudentMessage) cic.getOis().readObject();
        if ("success".equals(stm.getType())) {
            System.out.println("用户" + stm.getStu().getStuName() + "登录成功，欢迎使用");
            clientStudentOperation();
        } else {
            System.out.println("账号密码错误或用户不存在，登录失败");
        }
    }

    /**
     * 自定义成员方法，绘制学员登录成功后的界面
     */
    private void clientStudentOperation() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("******学员操作界面******");
            System.out.println("      [1] 开始考试");
            System.out.println("      [2] 导出成绩");
            System.out.println("      [3] 查询成绩");
            System.out.println("      [4] 修改密码");
            System.out.println("      [5] 返回上一层");
            System.out.println("      [6] 退出系统");
            System.out.println("************************");
            System.out.println("请输入需要执行的业务编号: ");
            String choice = ScannerUtil.scannerOpen().next();
            if ("1".equals(choice)) {
                System.out.println("正在进入题库，考试即将开始...");
                startTest();
            } else if ("2".equals(choice)) {
                System.out.println("敬请期待...");
            } else if ("3".equals(choice)) {
                System.out.println("正在打开查询页面，请稍后...");
                sd.checkTest();
            } else if ("4".equals(choice)) {
                // 修改密码
                updatePasswordById();
            } else if ("5".equals(choice)) {
                System.out.println("成功返回上一层");
                break;
            } else if ("6".equals(choice)) {
                // 退出系统
                System.out.println("成功退出系统，欢迎下次使用");
                systemExit();
            } else {
                System.out.println("输入不合理，请重新输入: ");
            }
        }
    }

    /**
     * 自定义成员方法，实现学生考试
     */
    private void startTest() {
        System.out.println("请输入学号: ");
        int stuId = ScannerUtil.scannerOpen().nextInt();
        sd.startTest(stuId);
    }

    /**
     * 自定义成员方法，实现管理员的登录
     */
    private void clientManagerLogin() throws IOException, ClassNotFoundException {
        System.out.println("请输入管理员用户名: ");
        String userName = ScannerUtil.scannerOpen().next();
        System.out.println("请输入管理员用户密码: ");
        String password = ScannerUtil.scannerOpen().next();
        User user = new User(userName, password);
        UserMessage um = new UserMessage("managerCheck", user);
        // 通过对象输出流将UserMessage对象传给服务器
        cic.getOos().writeObject(um);
        um = (UserMessage) cic.getOis().readObject();
        if ("success".equals(um.getType())) {
            System.out.println("管理员" + um.getUser().getUserName() + "登录成功，欢迎使用");
            System.out.println();
            // 管理员登录成功后的操作界面
            clientManagerOperation();
        } else {
            System.out.println("用户名或密码错误，登录失败");
        }
    }

    /**
     * 自定义成员方法，绘制管理员登录成功后的界面
     */
    private void clientManagerOperation() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("******管理员操作界面******");
            System.out.println("      [1] 学员管理模块");
            System.out.println("      [2] 考题管理模块");
            System.out.println("      [3] 返回上一层");
            System.out.println("      [4] 退出系统");
            System.out.println("***********************");
            System.out.println("请输入需要执行的业务编号: ");
            int choice = ScannerUtil.scannerOpen().nextInt();
            switch (choice) {
                case 1:
                    System.out.println("正在进入学员管理模块...");
                    studentManagement();
                    break;
                case 2:
                    System.out.println("正在进入考题管理模块...");
                    examManagement();
                    break;
                case 3:
                    System.out.println("成功返回上一层");
                    return;
                case 4:
                    System.out.println("成功退出系统，欢迎下次使用");
                    systemExit();
                default:
                    System.out.println("输入不合理，请重新输入: ");
            }
        }
    }

    /**
     * 自定义成员方法，实现管理员对学员信息的管理操作
     */
    private void studentManagement() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("******学员管理******");
            System.out.println("      [1] 添加学员");
            System.out.println("      [2] 修改学员");
            System.out.println("      [3] 删除学员");
            System.out.println("      [4] 查询学员");
            System.out.println("      [5] 返回上一层");
            System.out.println("      [6] 退出系统");
            System.out.println("********************");
            System.out.println("请输入需要执行的业务编号: ");
            String choice = ScannerUtil.scannerOpen().next();
            if ("1".equals(choice)) {
                // 添加学员
                addStuView();
            } else if ("2".equals(choice)) {
                // 修改学员
                System.out.println("[1] 根据学号修改学员密码");
                System.out.println("[2] 根据学号修改学员姓名");
                System.out.println("请输入要修改学员信息的类型: ");
                String selNum = ScannerUtil.scannerOpen().next();
                if ("1".equals(selNum)) {
                    updatePasswordById();
                } else if ("2".equals(selNum)) {
                    updateNameById();
                } else {
                    System.out.println("输入有误，请重新输入");
                }
            } else if ("3".equals(choice)) {
                // 删除学员
                removeStu();
            } else if ("4".equals(choice)) {
                // 查询学员
                sd.showStu();
            } else if ("5".equals(choice)) {
                // 返回上一层
                System.out.println("成功返回上一层");
                break;
            } else if ("6".equals(choice)) {
                // 退出系统
                System.out.println("成功退出系统，欢迎下次使用");
                systemExit();
            } else {
                System.out.println("输入不合理，请重新输入: ");
            }
        }
    }


    /**
     *自定义成员方法实现学员的删除
     */
    private void removeStu() {
        System.out.println("请输入要删除的学员的学号: ");
        int id = ScannerUtil.scannerOpen().nextInt();
        if (sd.removeStu(id)) {
            System.out.println("删除学员信息成功");
        } else {
            System.out.println("输入的学号不存在，删除失败");
        }
    }


    private void updateNameById() {
        System.out.println("请输入学员的学号: ");
        int id = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入学员的新姓名: ");
        String newStuName = ScannerUtil.scannerOpen().next();
        if (sd.updateStuName(id, newStuName)) {
            System.out.println("修改学员姓名成功");
        } else {
            System.out.println("学号不存在，修改学员姓名失败");
        }
    }

    private void updatePasswordById() {
        System.out.println("请输入学员的学号: ");
        int id = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入学员的新密码: ");
        String newStuPassword = ScannerUtil.scannerOpen().next();
        if (sd.updateStuPass(id, newStuPassword)) {
            System.out.println("修改学员密码成功");
        } else {
            System.out.println("学号不存在，修改学员密码失败");
        }
    }

    private void addStuView() {
        System.out.println("请输入学员的学号: ");
        int id = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入学员姓名: ");
        String stuName = ScannerUtil.scannerOpen().next();
        System.out.println("请输入学员密码: ");
        String stuPassword = ScannerUtil.scannerOpen().next();
        Student stu = new Student(id, stuName, stuPassword);
        if (sd.addStu(stu)) {
            System.out.println("添加学员成功");
        } else {
            System.out.println("学号已存在，添加学员失败");
        }
    }

    /**
     * 自定义成员方法，实现管理员对考试模块的管理操作
     */
    private void examManagement() throws IOException, ClassNotFoundException {
        while (true) {
            System.out.println("******考题管理******");
            System.out.println("      [1] 增加考题");
            System.out.println("      [2] 修改考题");
            System.out.println("      [3] 删除考题");
            System.out.println("      [4] 查询考题");
            System.out.println("      [5] 导入考题");
            System.out.println("      [6] 返回上一层");
            System.out.println("      [7] 退出系统");
            System.out.println("********************");
            System.out.println("请输入需要执行的业务编号: ");
            String choice = ScannerUtil.scannerOpen().next();
            if ("1".equals(choice)) {
                // 增加考题
                addQuestion();
            } else if ("2".equals(choice)) {
                // 修改考题
                updateQue();
            } else if ("3".equals(choice)) {
                // 删除考题
                removeQue();
            } else if ("4".equals(choice)) {
                // 查询考题
                sd.showQue();
            } else if ("5".equals(choice)) {
                // 导入考题
                System.out.println("敬请期待...");
            } else if ("6".equals(choice)) {
                // 返回上一层
                System.out.println("成功返回上一层");
                break;
            } else if ("7".equals(choice)) {
                // 退出系统
                System.out.println("成功退出系统，欢迎下次使用");
                systemExit();
            } else {
                System.out.println("输入不合理，请重新输入: ");
            }
        }
    }

    private void removeQue() {
        System.out.println("请输入需要删除的题目编号: ");
        int qId = ScannerUtil.scannerOpen().nextInt();
        if (sd.removeQue(qId)) {
            System.out.println("删除题目成功");
        } else {
            System.out.println("题号不存在，删除题目失败");
        }
    }

    private void updateQue() {
        System.out.println("请输入要修改的题号: ");
        int qId = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入需要修改的正确答案: ");
        String rightAnswer = ScannerUtil.scannerOpen().next();
        if (sd.updateQueAnswer(qId, rightAnswer)) {
            System.out.println("修改题目答案成功");
        } else {
            System.out.println("修改题目答案失败");
        }
    }

    private void addQuestion() {
        System.out.println("请输入要添加的题目编号: ");
        int qId = ScannerUtil.scannerOpen().nextInt();
        System.out.println("请输入题目信息: ");
        String qWords = ScannerUtil.scannerOpen().next();
        System.out.println("请输入选项A:");
        String answerA = ScannerUtil.scannerOpen().next();
        System.out.println("请输入选项B:");
        String answerB = ScannerUtil.scannerOpen().next();
        System.out.println("请输入选项C:");
        String answerC = ScannerUtil.scannerOpen().next();
        System.out.println("请输入选项D:");
        String answerD = ScannerUtil.scannerOpen().next();
        System.out.println("请输入题目的正确答案: ");
        String rightAnswer = ScannerUtil.scannerOpen().next();
        Question que = new Question(qId, qWords, answerA, answerB, answerC, answerD, rightAnswer);
        if (sd.addQuestion(que)) {
            System.out.println("添加题目成功");
        } else {
            System.out.println("题号重复，添加题目失败");
        }
    }
}
